package com.zjitc.common.redis;


import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Create by IntelliJ IDEA
 *
 * @author: jsonor
 * @date-Time: 2018/4/16 15:38
 * @description:
 */
public interface RedisCache {

//=============================key============================

  /**
   * 指定缓存失效时间
   *
   * @param key 键
   * @param time 时间(秒)
   */
  void expire(String key, int time);

  /**
   * 根据key 获取过期时间
   *
   * @param key 键 不能为null
   * @return 时间(秒) 返回0代表为永久有效
   */
  long getExpire(String key);


  /**
   * 移除key的过期时间
   * @param key
   * @return
   */
  long moveExpire(String key);

  /**
   * 判断key是否存在
   *
   * @param key 键
   * @return true 存在 false不存在
   */
  boolean exists(String key);


  /**
   * 删除缓存
   * @param keys
   * @return
   */
  long del(String... keys);

  //============================String=============================

  /**
   * 普通缓存获取
   *
   * @param key 键
   * @return 值
   */
  Object get(String key);

  /**
   * 普通缓存放入
   *
   * @param key 键
   * @param value 值
   * @return true成功 false失败
   */
  boolean set(String key, String value);

  /**
   * 普通缓存放入并设置时间
   *
   * @param key 键
   * @param value 值
   * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
   * @return true成功 false 失败
   */
  boolean set(String key, String value, int time);

  /**
   * 递增
   * @param key
   * @param delta
   * @return
   */
  long increase(String key, long delta);

  /**
   * 递减
   * @param key
   * @param delta
   * @return
   */
  long decrease(String key, long delta);

  //================================Hash=================================


  /**
   * 查看哈希表key中，指定的字段是否存在
   * @param key
   * @param field
   * @return
   */
  boolean existsHash(String key, String field);

  /**
   * 获取存储在哈希表中指定字段的值。
   * @param key
   * @param field
   * @return
   */
  String hashMapget(String key, String field);

  /**
   * 获取hashKey对应的所有键值
   * @param key 键
   * @return 对应的多个键值
   */
  Map<String, String> hashMapGetAll(String key);

  /**
   * 获取hashkey 对应的所有value
   * @param key
   * @param classOfT
   * @param <T>
   * @return
   */
  <T> List<T> hashListGetAll(String key, Class<T> classOfT);

  /**
   * hashgetObject
   * @param key
   * @param filed
   * @param classOfT
   * @param <T>
   * @return
   */
  <T> T hashgetObject(String key, String filed, Class<T> classOfT);

  /**
   * 将哈希表 key 中的字段 field 的值设为 value
   * @param key
   * @param filed
   * @param value
   * @return
   */
  Long hashset(String key, String filed, String value);

  /**
   * 同时将多个 key-value (域-值)对设置到哈希表 key 中。
   * @param key 键
   * @param map 对应多个键值
   * @return true 成功 false 失败
   */
  String hashMapset(String key, Map<String, String> map);


  /**
   * 同时将多个 key-value (域-值)对设置到哈希表 key 中 并设置时间
   * @param key
   * @param map
   * @param time
   * @return
   */
  String hashMapset(String key, Map<String, String> map, int time);

  /**
   * 只有在字段 field 不存在时，设置哈希表字段的值。
   * @param key 键
   * @param field 项
   * @param value 值
   * @return true 成功 false失败
   */
  Long hashExistset(String key, String field, String value);

  /**
   * 只有在字段 field 不存在时，设置哈希表字段的值。 并设置时间
   * @param key 键
   * @param field 项
   * @param value 值
   * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
   * @return true 成功 false失败
   */
  Long hashExistset(String key, String field, String value, int time);

  /**
   * 删除hash表中的值
   *
   * @param key 键 不能为null
   * @param field 项 可以使多个 不能为null
   */
  void delHash(String key, String... field);

  //============================set=============================


  /**
   * 根据key获取Set中的所有值
   * @param key
   * @return
   */
  Set<String> getAllSet(String key);

  /**
   * 根据value从一个set中查询,是否存在
   *
   * @param key 键
   * @param value 值
   * @return true 存在 false不存在
   */
  boolean existsSet(String key, String value);

  /**
   * 向集合添加一个或多个成员
   *
   * @param key 键
   * @param values 值 可以是多个
   * @return 成功个数
   */
  long addSet(String key, String... values);

  /**
   * 向集合添加一个或多个成员  并设置时间
   *
   * @param key 键
   * @param time 时间(秒)
   * @param values 值 可以是多个
   * @return 成功个数
   */
  long addSet(String key, int time, String... values);

  /**
   * 获取set缓存的长度
   * @param key
   * @return
   */
  long getSetLength(String key);

  /**
   * 移除值为value的
   *
   * @param key 键
   * @param values 值 可以是多个
   * @return 移除的个数
   */
  long removeSetby(String key, String... values);

  //===============================list==================================

  /**
   * 获取list缓存的长度
   * @param key
   * @return
   */
  long getListSize(String key);

  /**
   * 通过索引 获取list中的值
   * @param key
   * @param index
   * @return
   */
  Object getListIndex(String key, long index);

  /**
   * 将list放入缓存 从头开始
   * @param key 键
   * @param value 值
   */
  void addListL(String key, String... value);

  /**
   * 将list放入缓存
   * @param key
   * @param value
   * @param time
   * @return
   */
  boolean addListL(String key, String value, int time);

  /**
   * 将list放入缓存
   *
   * @param key 键
   * @param value 值
   */
  void addListR(String key, String... value);

  /**
   * 将list放入缓存
   * @param key
   * @param time
   * @param value
   * @return
   */
  boolean addListR(String key, int time, String... value);


  /**
   * 根据索引修改list中的某条数据
   * @param key
   * @param index
   * @param value
   * @return
   */
  boolean setByIndex(String key, int index, String value);

  /**
   * 移除N个值为value
   *
   * @param key 键
   * @param count 移除多少个
   * @param value 值
   * @return 移除的个数
   */
  long lRemove(String key, long count, String value);


}